#include"TcpSeerver.hpp"
#include<iostream>
#include<memory>
using namespace std;

//梳理一下整个tcp项目的运行思路：
//1，首先是启动服务器，服务器运行起来后机会创建一个线程池，并且会启动线程池，此时该服务器进程中还运行着线程池中的线程
//2，此时服务器处于监听状态（也即是等待连接的状态），线程池中的线程也在条件变量下等待
//3，客户端启动并且和服务器连接上，此时服务器和客户端通过全双工的一个文件资源进行通信
//4，服务器和客户端连接上后就把该连接的一些信息都打包在一个任务中发送给了线程池的任务队列，让线程去处理后续任务，服务器进行下一轮的监听新的客户端连接
//5，push成功后就会唤醒一个等待的线程，该线程会执行任务，从而调用任务中的run函数，任务运行起来，在任务中，线程会使用服务器传递进来的文件描述符和客户端进行通信（线程池中的线程和服务器虽然是不同线程但是是属于同一个进程的，所以资源都是共享的，包括文件描述符表）
//6，线程会处理客户端的英文翻译后再发送给客户端，完成这些任务后就会甘关闭对这个客户端的文件描述符，客户端完成最后的接收后，也会关闭对应的文件描述符，此时客户端与服务器的这一次通信算作完成了，并且双方都关闭了对应的文件描述符，文件资源得到释放
//7，此时线程处理完任务继续陷入等待队列，客户端如果不退出的话会重新开始对服务器进行连接，开始新一轮的请求（也会创建新的文件描述符）
//8，新的一轮连接开始，服务器会接收这个连接并创建对应的文件描述符，然后创建新的任务交给线程，此时进入第4步，接下来的就是循环处理了
//注意：运行过程中可以有多个客户端对服务器发送请求，都是可以并发处理的，上面只是举例一个客户端连接的例子

void Usage(string proc)
{
    cout<<"\n\rUsage:"<<proc<<"port[1024+]\n"<<endl;
}

int main(int argc,char*argv[])
{
    if(argc!=2)
    {
        Usage(argv[0]);
        exit(UsageError);
    }
    uint16_t port=stoi(argv[1]);
    lg.Enable(Mulfile);//设置日志的输出模式（由于所有的文件都是公用这一个日志对象，所以改这个对象即可）
    unique_ptr<TcpServer>tcp_svr(new TcpServer(port));
    tcp_svr->InitServer();
    tcp_svr->Start();//启动服务器
    return 0;
}
